變數提供了一個有名稱的記憶體位址
當我們宣告 int x = 0
的時候
其實是系統在記憶體當中找一塊 int
大小的空間
記錄下記憶體位址(像是 0x23ff12,每次不一樣)
名稱設為 x
當我們要知道變數的位址的時候
可以使用&
來取得
int main(void) {
int x = 10;
printf("Value of x : %d\n", x);
printf("Address of x : %p\n", &x);
return 0;
}
/**
output:
Value of x : 10
Address of x : 0x23ff12
**/
type *param
Example:
int *num;
float *num2;
char *str01;
指標也必須宣告 目標 的變數型態
#include <stdio.h>
int main()
{
int num = 10;
int *prt = #
printf("The value of address where ptr point : %p\n", prt);
printf("num The value of num: %d", *prt);
return 0;
}
上述範例中第二次printf中 *prt
會顯示出指標所指的值
而不是位址
*
稱為提取運算子
#include <stdio.h>
int main()
{
int x = 10;
int *ptr = &x;
printf("The value is %d\n", *ptr);
*ptr = 20;
printf("The value is %d\n", *ptr);
printf("x: %d\n", x);
return 0;
}
/**
The value is 10
The value is 20
x : 20
**/
也就是代表若是修改指標的值
同時也會修改原本的值
之前曾經說過在Function 中修改值
並不會影響傳入的值
#include <stdio.h>
void swap(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int x = 5, y = 10;
printf("Before : x = %d, y = %d\n", x, y);
swap(x, y);
printf("After : x = %d, y = %d", x, y);
return 0;
}
/**
Before : x=5, y=10
After : x = 5, y = 10
**/
但是若我們傳入的是指標
#include <stdio.h>
void swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int x = 5, y = 10;
printf("Before : x = %d, y = %d\n", x, y);
//傳記憶體位址進去
swap(&x, &y);
printf("After : x = %d, y = %d\n", x, y);
return 0;
}
/**
Before : x=5, y=10
After : x = 10, y = 5
**/